import axios from 'axios';
import { createUniAppAxiosAdapter } from '@uni-helper/axios-adapter';
import { useUserStore } from '@/store/user';
import { BASE_URL } from '@/config/env';

axios.defaults.adapter = createUniAppAxiosAdapter();

// 创建axios实例
const http = axios.create({
  baseURL: BASE_URL, // 统一使用环境配置中的BASE_URL
  timeout: 30000, // 增加超时时间到30秒
  withCredentials: true,
  retry: 3, // 请求失败后重试次数
  retryDelay: 1000 // 重试间隔时间
});

// 请求拦截器
http.interceptors.request.use(config => {
  console.log('发送请求:', config.url);
  
  // 获取用户 Token
  const userStore = useUserStore();
  const token = userStore.token || uni.getStorageSync('token');
  console.log("token",token);
  if (token) {
    // 确保headers对象存在
    config.headers = config.headers || {};
    config.headers.Authorization = `Bearer ${token}`;
    console.log('发送请求携带的token:', token);
  } else {
    console.warn('未找到认证token');
  }
  
  return config;
}, error => {
  console.error('请求错误:', error);
  return Promise.reject(error);
});

// 响应拦截器
http.interceptors.response.use(
  response => {
    console.log('响应成功:', response.config.url, response.data);
    
    // 如果返回的状态码是 401，说明 Token 过期或无效
    if (response.data && response.data.code === 401) {
      // 获取用户状态
      const userStore = useUserStore();
      if (userStore.isLoggedIn) {
        // 清空登录状态
        userStore.logout();
        // 提示用户
        uni.showToast({
          title: '登录已过期，请重新登录',
          icon: 'none',
          duration: 2000
        });
        
        // 延时跳转到登录页面
        setTimeout(() => {
          uni.navigateTo({
            url: '/pages/login/login'
          });
        }, 1500);
      }
      return Promise.reject(new Error('登录已过期，请重新登录'));
    }
    
    return response.data;
  },
  error => {
    console.error('响应错误:', error);
    
    const config = error.config;
    
    // 如果配置了重试，并且是连接超时错误，就进行重试
    if (config && config.retry && (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED')) {
      config.__retryCount = config.__retryCount || 0;
      
      // 如果当前重试次数小于配置的重试次数
      if (config.__retryCount < config.retry) {
        config.__retryCount++;
        
        // 延时重试
        return new Promise(resolve => {
          setTimeout(() => {
            console.log(`重试请求: ${config.url} 第 ${config.__retryCount} 次`);
            resolve(http(config));
          }, config.retryDelay);
        });
      }
    }
    
    // 处理网络错误
    let errorMsg = '网络异常，请稍后重试';
    
    if (error.response) {
      // 服务器返回错误状态码
      switch (error.response.status) {
        case 401:
          errorMsg = '登录已过期，请重新登录';
          // 获取用户状态
          const userStore = useUserStore();
          if (userStore.isLoggedIn) {
            // 清空登录状态
            userStore.logout();
          }
          break;
        case 403:
          errorMsg = '没有权限访问该资源';
          break;
        case 404:
          errorMsg = '请求的资源不存在';
          break;
        case 500:
          errorMsg = '服务器内部错误';
          break;
        default:
          errorMsg = `服务器错误(${error.response.status})`;
      }
    } else if (error.code === 'ETIMEDOUT') {
      errorMsg = '请求超时，请检查网络后重试';
    } else if (error.request) {
      // 请求已发送但未收到响应
      errorMsg = '服务器无响应，请检查网络';
    }
    
    // 显示错误提示
    uni.showToast({
      title: errorMsg,
      icon: 'none',
      duration: 2000
    });
    
    return Promise.reject(error);
  }
);

export default http;